﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoBD;
using System.Data.SqlClient;
using CapaLogica.CL.Grupo;
using CapaLogica.CL.UtilidadesGenerales;

namespace CapaLogica.CL.Foro
{
    public class ForoPersistente
    {

        protected AcessoBD _acceso = new AcessoBD();

        internal ForoPersistente()
        {

        }
        /// <summary>
        /// Registrar Foro
        /// </summary>
        /// <param name="pGrupo">Grupo del foro, tipo CL_Grupo</param>
        /// <param name="pIdProfesor">id del profesor del foro, tipo int</param>
        /// <param name="pIdGrupoProfesor">id de la relacion grupo profesor, tipo int</param>
        /// <param name="pTran">Transaccion de las inserciones, tipo SQLTRansaccion</param>
        /// <param name="pIUsuario">id del usuario que realiza la accion, tipo int</param>
        /// <remarks></remarks>
        public void registrarForo(CL_Grupo pGrupo, int pIdProfesor, int pIdGrupoProfesor,  SqlTransaction pTran, int pIdUsuario)
        {
            try
            {
                Cl_Foro foro = new Cl_Foro();
                foro.IdGrupo = pGrupo.Id;
                foro.IdProfesor = pIdProfesor;

                
                foro.Nombre = pGrupo.Curso.nombre + "-" + foro.Profesor.PrimerApellido + " " + foro.Profesor.SegundoApellido +
                                    " " + foro.Profesor.Nombre;

                String sql = @"insert into dbo.T_Foro (nombre, id_profesor_grupo)
                                values(param1, param2) ";

                Parametros[] parametros = new Parametros[2];
                parametros[0] = new Parametros(foro.Nombre, "param1");
                parametros[1] = new Parametros(pIdGrupoProfesor, "param2");

                foro.Id = _acceso.executeSQLInsertTransation(pTran, sql, parametros);

                Modulo.insertarBitacoraParaTransaccion(pTran, pIdUsuario, "Creación del foro de un grupo",
                                                        foro.Id, 6, 1);
            }
            catch (Exception ex )
            {
                
                throw ex;
            }

        }





        /// <summary>
        /// Listar foros de un profesor
        /// </summary>
        /// <param name="pIdProfesor">pIdProfesor, tipo int</param>
        /// <remarks></remarks>
        //public List<Cl_Foro> buscarForosProfesor(int pIdProfesor)
        //{
        //    try
        //    {
        //        String sql = @"dbo.sp_buscar_foros_profesor";

        //        Parametros[] parametros = new Parametros[1];
        //        parametros[0] = new Parametros(pIdProfesor, "idProfesor");

        //        SqlDataReader reader = _acceso.execute_SP_Consulta(sql, parametros);
        //        List<Cl_Foro> foros = new List<Cl_Foro>();
        //        Cl_Foro foro = null;
        //        while(reader.Read())
        //        {
        //            foro = new Cl_Foro();
        //            foro.Id = reader.GetInt32(0);
        //            foro.Nombre = reader.GetString(1);
        //            foro.IdGrupo = reader.GetInt32(2);
        //            foro.IdProfesor = reader.GetInt32(3);
        //            foros.Add(foro);
        //        }

        //        return foros;
        //    }
        //    catch (Exception ex)
        //    {

        //        throw ex;
        //    }

        //}




        /// <summary>
        /// Listar foros de un profesor
        /// </summary>
        /// <param name="pIdProfesor">pIdProfesor, tipo int</param>
        /// <remarks></remarks>
        public List<EsForo> buscarForosPersona(int pIdPersona, String pSql, String pNombreParametro)
        {
            try
            {

                Parametros[] parametros = new Parametros[1];
                parametros[0] = new Parametros(pIdPersona, pNombreParametro);

                SqlDataReader reader = _acceso.execute_SP_Consulta(pSql, parametros);
                List<EsForo> foros = new List<EsForo>();
               
                while (reader.Read())
                {
                    EsForo foro = new EsForo(reader.GetInt32(0) + "", reader.GetString(1), reader.GetInt32(2) + "");

                    foros.Add(foro);
                }

                return foros;
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

        /// <summary>
        /// Busca un Foro por su id
        /// </summary>
        /// <param name="pIdForo">Codigo del foro, tipo int</param>
        /// <remarks></remarks>
        internal  Cl_Foro buscarForoPorId(int pIdForo)
        {
            string psp = @"dbo.sp_buscar_foro";
            Cl_Foro foro = null;
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pIdForo, "idForo");
            AcessoBD acceso = new AcessoBD();
            
            try
            {
                SqlDataReader reader = acceso.execute_SP_Consulta(psp, parametros);

                if (reader.Read())
                {
                    foro = new Cl_Foro();
                    foro.Id = reader.GetInt32(0);
                    foro.Nombre = reader.GetString(1);
                    foro.IdGrupo = reader.GetInt32(2);
                    foro.IdProfesor = reader.GetInt32(3);
            
                }

                reader.Close();
                return foro;

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }


        public void expulsarEstudiante(int pIdForo, int pIdEstudiante, String pJustificacion, int pIdUsuario)
        {
            String sql = @"insert into  dbo.T_Estudiante_Expulsado (id_foro, id_estudiante, justificacion)
                            values(param1, param2, param3)";

            Parametros[] parametros = new Parametros[3];
            parametros[0] = new Parametros(pIdForo, "param1");
            parametros[1] = new Parametros(pIdEstudiante, "param2");
            parametros[2] = new Parametros(pJustificacion, "param3");
            int pId = 0;
            try
            {
               pId = _acceso.executeSQLInsert(sql, parametros);
               Modulo.insertarBitacora(pIdUsuario, "Se expulsa un estudiante de un foro.", pId, 8, 1);
            }
            catch (Exception ex)
            {
                
                throw ex;
            }

        }

        public void anularExpulcionEstudiante(int pIdForo, int pIdEstudiante, int pIdUsuario)
        {
            String sql = @"delete from dbo.T_Estudiante_Expulsado where id_foro= param1 and id_estudiante= param2";

            Parametros[] parametros = new Parametros[2];
            parametros[0] = new Parametros(pIdForo, "param1");
            parametros[1] = new Parametros(pIdEstudiante, "param2");
  
            try
            {
                _acceso.executeSQL(sql, parametros);
                Modulo.insertarBitacora(pIdUsuario, "Se anula la expulsion de un estudiante de un foro.", pIdForo , 6, 2);
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }


        public List<Cl_Usuario> buscarEstudiantesExpulsados(int pIdForo)
        {
            String sql = "sp_listar_estudiantes_expulsados";
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pIdForo, "idForo");
            List<Cl_Usuario> estudiantes = new List<Cl_Usuario>();
            Cl_Usuario estudiante = null;

            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(sql, parametros);

                while (reader.Read())
                {
                    estudiante = new Cl_Usuario(reader.GetString(1),  reader.GetString(2), reader.GetString(3), 
                                                    reader.GetString(4), reader.GetString(5), reader.GetDateTime(6),
                                                    reader.GetInt32(7), reader.GetString(8), reader.GetString(9)) ;

                    estudiante.Id = reader.GetInt32(0);

                    estudiantes.Add(estudiante);
                }

                return estudiantes;
            }
            catch (Exception)
            {
                
                throw;
            }
        }




        public List<Cl_Usuario> buscarEstudiantesNoExpulsados(int pIdForo)
        {
            String sql = "sp_listar_estudiantes_no_expulsados";
            Parametros[] parametros = new Parametros[1];
            parametros[0] = new Parametros(pIdForo, "idForo");
            List<Cl_Usuario> estudiantes = new List<Cl_Usuario>();
            Cl_Usuario estudiante = null;

            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(sql, parametros);

                while (reader.Read())
                {
                    estudiante = new Cl_Usuario(reader.GetString(1), reader.GetString(2), reader.GetString(3),
                                                    reader.GetString(4), reader.GetString(5), reader.GetDateTime(6),
                                                    reader.GetInt32(7), reader.GetString(8), reader.GetString(9));

                    estudiante.Id = reader.GetInt32(0);

                    estudiantes.Add(estudiante);
                }

                return estudiantes;
            }
            catch (Exception)
            {

                throw;
            }
        }

        public String justificacionExpulsion(int pIdForo, int pIdEstudiante)
        {
            String sql = "sp_justificacion_expulsion";
            Parametros[] parametros = new Parametros[2];
            parametros[0] = new Parametros(pIdForo, "idForo");
            parametros[1] = new Parametros(pIdEstudiante , "idEstudiante");
            String justificacion = "";
    
            try
            {
                SqlDataReader reader = _acceso.execute_SP_Consulta(sql, parametros);

                if (reader.Read())
                {
                    justificacion = reader.GetString(0);
                }

                return justificacion;
            }
            catch (Exception)
            {

                throw;
            }
        }

        //public static List<Cl_Usuario> buscarForos(int pidCarrera, int pidcurso, int pidGrupo)
        //{
        //    AcessoBD _accesoBD = new AcessoBD();
        //    int countParam = 0;
        //    countParam += pidCarrera > -1 ? 1 : 0;
        //    countParam += pidcurso > -1 ? 1 : 0;
        //    countParam += pidGrupo > -1 ? 1 : 0;

        //    string[] listaParams = { "id_carrera", "id_curso", "id_grupo" };


        //    List<EsForo> foros = new List<EsForo>();
            
        //    string sp = @"dbo.sp_buscar_foros";
            
        //    int index = 0;
        //    Parametros[] parametros = new Parametros[countParam];

        //    if (pidCarrera > 0)
        //    {
        //        parametros[index] = new Parametros(pidCarrera, listaParams[0]);
        //        index++;
        //    }

        //    if (pidcurso > -1)
        //    {
        //        parametros[index] = new Parametros(pidcurso, listaParams[1]);
        //        index++;
        //    }

        //    if (pidGrupo > -1)
        //    {
        //        parametros[index] = new Parametros(pidGrupo, listaParams[2]);
        //        index++;
        //    }


        //    try
        //    {
        //        SqlDataReader reader = _accesoBD.execute_SP_Consulta(sp, parametros);

        //        while (reader.Read())
        //        {
        //            usuario = new Cl_Usuario(reader.GetString(reader.GetOrdinal("cedula")),
        //                                 reader.GetString(reader.GetOrdinal("nombre")),
        //                                 reader.GetString(reader.GetOrdinal("primer_apellido")),
        //                                 reader.GetString(reader.GetOrdinal("segundo_apellido")),
        //                                 reader.GetString(reader.GetOrdinal("genero")),
        //                                 reader.GetDateTime(reader.GetOrdinal("fecha_nacimiento")),
        //                                 (int)reader.GetInt32(reader.GetOrdinal("id_rol")),
        //                                 reader.GetString(reader.GetOrdinal("correo")),
        //                                 reader.GetString(reader.GetOrdinal("contrasenna")));


        //            usuario.Id = reader.GetInt32(reader.GetOrdinal("id_usuario"));
        //            usuario.IdPersona = reader.GetInt32(reader.GetOrdinal("id_persona"));
        //            usuario.NombreRol = reader.GetString(reader.GetOrdinal("nom_rol"));

        //            foros.Add(usuario);
        //        }
        //        reader.Close();
        //        return foros;
        //    }
        //    catch (Exception ex)
        //    {
        //        throw new System.Exception(ex.Message);
        //    }


        //}


        /// <summary>
        /// </summary>
        /// <param name="pIdProfesor"></param>
        /// <returns></returns>
        //public List<Cl_Foro> buscarForosProfesorTema(int pIdProfesor)
        //{
        //    try
        //    {
        //        String sql = @"dbo.sp_buscar_foros_profesor";

        //        Parametros[] parametros = new Parametros[1];
        //        parametros[0] = new Parametros(pIdProfesor, "idProfesor");

        //        SqlDataReader reader = _acceso.execute_SP_Consulta(sql, parametros);
        //        List<Cl_Foro> foros = new List<Cl_Foro>();
        //        Cl_Foro foro = null;
        //        while (reader.Read())
        //        {
        //            foro = new Cl_Foro();
        //            foro.Id = reader.GetInt32(0);
        //            foro.Nombre = reader.GetString(1);
        //            foros.Add(foro);
        //        }

        //        return foros;
        //    }
        //    catch (Exception ex)
        //    {

        //        throw ex;
        //    }

        //}


        /// <summary>
        /// Listar foros de un profesor
        /// </summary>
        /// <param name="pIdProfesor">pIdProfesor, tipo int</param>
        /// <remarks></remarks>
        public List<EsForo> buscarForos(int pidCarrera, int pidCurso, int pidGrupo)
        {
            try
            {
                string psp = @"dbo.sp_buscar_foros_web";

                Parametros[] parametros = new Parametros[3];
                parametros[0] = new Parametros(pidCarrera, "idCarrera");
                parametros[1] = new Parametros(pidCurso, "idCurso");
                parametros[2] = new Parametros(pidGrupo, "idGrupo");

                SqlDataReader reader = _acceso.execute_SP_Consulta(psp, parametros);
                List<EsForo> foros = new List<EsForo>();
                EsForo foro;

                while (reader.Read())
                {
                    foro = new EsForo();
                    foro.Id = reader.GetInt32(0) + "";
                    foro.Nombre = reader.GetString(1).ToString();
                    foro.CantidadTemas = reader.GetInt32(2) + "";
                    foros.Add(foro);
                }

                return foros;
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

    }
}
